using Admin2025.Domain.Entities.App;
using Admin2025.Domain.Repositories;

namespace Admin2025.Application.Services;

/// <summary>
/// 用户服务类，提供用户相关的操作，如获取用户列表、创建用户、更新用户、删除用户以及角色分配等。
/// </summary>
public class UserService
{
    private readonly IRepository<AppUser> _userRep; // 用户仓库，用于与用户数据交互
    private readonly IRepository<AppRole> _roleRep; // 角色仓库，用于与角色数据交互

    /// <summary>
    /// 构造函数，注入用户仓库和角色仓库。
    /// </summary>
    /// <param name="userRep">用户仓库</param>
    /// <param name="roleRep">角色仓库</param>
    public UserService(IRepository<AppUser> userRep, IRepository<AppRole> roleRep)
    {
        _userRep = userRep;
        _roleRep = roleRep;
    }

    /// <summary>
    /// 获取所有用户。
    /// </summary>
    /// <returns>返回用户集合</returns>
    public async Task<IEnumerable<AppUser>> GetAllAsync()
    {
        return await _userRep.GetAllAsync(); // 调用用户仓库的获取所有方法
    }

    /// <summary>
    /// 根据用户ID获取用户。
    /// </summary>
    /// <param name="id">用户ID</param>
    /// <returns>返回用户实体，如果用户不存在则返回null</returns>
    public async Task<AppUser?> GetByIdAsync(Guid id)
    {
        return await _userRep.GetByIdAsync(id); // 调用用户仓库的根据ID获取方法
    }

    /// <summary>
    /// 创建新用户。
    /// </summary>
    /// <param name="user">要创建的用户实体</param>
    /// <returns>返回创建后的用户实体</returns>
    public async Task<AppUser> CreateAsync(AppUser user)
    {
        return await _userRep.CreateAsync(user); // 调用用户仓库的创建方法
    }

    /// <summary>
    /// 更新用户信息。
    /// </summary>
    /// <param name="user">要更新的用户实体</param>
    public async Task UpdateAsync(AppUser user)
    {
        await _userRep.UpdateAsync(user); // 调用用户仓库的更新方法
    }

    /// <summary>
    /// 根据用户ID删除用户。
    /// </summary>
    /// <param name="id">用户ID</param>
    public async Task DeleteAsync(Guid id)
    {
        var user = await _userRep.GetByIdAsync(id); // 首先根据ID获取用户
        if (user == null) throw new Exception("用户不存在"); // 如果用户不存在，抛出异常
        await _userRep.DeleteAsync(user); // 调用用户仓库的删除方法
    }

    /// <summary>
    /// 为用户分配角色。
    /// </summary>
    /// <param name="userId">用户ID</param>
    /// <param name="roleId">角色ID</param>
    public async Task AssignRoleAsync(Guid userId, Guid roleId)
    {
        var user = await _userRep.GetByIdAsync(userId); // 根据用户ID获取用户
        var role = await _roleRep.GetByIdAsync(roleId); // 根据角色ID获取角色
        if (user == null || role == null) throw new Exception("用户或角色不存在"); // 如果用户或角色不存在，抛出异常
        user.AssignRole(role); // 调用用户实体的方法为用户分配角色
        await _userRep.UpdateAsync(user); // 更新用户信息
    }

    /// <summary>
    /// 为用户移除角色。
    /// </summary>
    /// <param name="userId">用户ID</param>
    /// <param name="roleId">角色ID</param>
    public async Task RemoveRoleAsync(Guid userId, Guid roleId)
    {
        var user = await _userRep.GetByIdAsync(userId); // 根据用户ID获取用户
        var role = await _roleRep.GetByIdAsync(roleId); // 根据角色ID获取角色
        if (user == null || role == null) throw new Exception("用户或角色不存在"); // 如果用户或角色不存在，抛出异常
        user.RemoveRole(role); // 调用用户实体的方法为用户移除角色
        await _userRep.UpdateAsync(user); // 更新用户信息
    }
}